#pragma once

#include <iostream>
#include <string>
#include <sys/epoll.h>
#include "err.hpp"
#include "log.hpp"
#include "sock.hpp"

namespace epoll_ns
{
    static const uint16_t defaultport = 8080;
    static const int size = 128;
    static const int defaultvalue = -1;

    class EpollServer
    {
    public:
        EpollServer(const uint16_t port = defaultport)
            : _listensock(defaultvalue), _port(port), _epfd(defaultvalue)
        {
        }

        void init()
        {
            // 1. 创建socket
            _listensock = Sock::Socket();
            Sock::Bind(_listensock, _port);
            Sock::Listen(_listensock);
            
            // 2. 创建epoll模型
            _epfd = epoll_create1(size);
            if(_epfd < 0)
            {
                logMessage(FATAL, "create epoll err: %s", strerror(errno));
                exit(CREATE_EPOLL_ERR);
            }

            // 3. 添加_listensock到epoll中
            struct epoll_event ev;
            ev.events = EPOLLIN;
            ev.data.fd = _listensock;
            epoll_ctl(_epfd, EPOLL_CTL_ADD, _listensock, &ev);

        }

        void start()
        {
            for(;;)
            {
                // ...
            }
        }

        ~EpollServer()
        {
            if(_listensock != defaultvalue)
                close(_listensock);
            if(_epfd != defaultvalue)
                close(_epfd);
        }

    private:
        int _listensock;
        uint16_t _port;
        int _epfd;
    };
} // namespace epoll_ns
